package com.tripcube.ai.model.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;

/**
 * RAG（检索增强生成）聊天请求数据传输对象
 * 
 * @author alander
 */
@Data
@Schema(description = "RAG聊天请求DTO")
public class RagChatDTO {
    
    /**
     * 用户查询内容
     * 用户输入的问题或查询语句，将用于在知识库中检索相关信息
     */
    @NotBlank(message = "查询内容不能为空")
    @Schema(description = "用户查询内容", example = "什么是人工智能？")
    private String query;
    
    /**
     * 会话ID
     * 用于标识和维护对话上下文的唯一标识符
     */
    @Schema(description = "会话ID", example = "conv_123456")
    private String conversationId;
    
    /**
     * 知识库ID
     * 指定用于检索的知识库标识符，必须是有效的知识库ID
     */
    @NotNull(message = "知识库ID不能为空")
    @Schema(description = "知识库ID", example = "1")
    private String knowledgeBaseId;
    
    /**
     * 系统提示词
     * 用于指导AI模型行为的系统级提示信息，定义AI的角色和回答风格
     */
    @Schema(description = "系统提示词", example = "你是一个专业的AI助手")
    private String systemPrompt = "你是一个专业的AI助手，请根据提供的知识库内容回答用户问题。";
    
    /**
     * AI角色
     * 定义AI在对话中的角色类型，影响回答的风格和专业程度
     */
    @Schema(description = "AI角色", example = "assistant")
    private String role = "assistant";
    
    /**
     * 检索返回的文档数量
     * 从知识库中检索的相关文档数量，用于控制检索结果的数量
     */
    @Min(value = 1, message = "topK值不能小于1")
    @Max(value = 20, message = "topK值不能大于20")
    @Schema(description = "检索返回的文档数量", example = "5")
    private Integer topK = 5;
    
    /**
     * 相似度阈值
     * 文档检索时的相似度过滤阈值，只有相似度高于此值的文档才会被返回
     */
    @Min(value = 0, message = "相似度阈值不能小于0")
    @Max(value = 1, message = "相似度阈值不能大于1")
    @Schema(description = "相似度阈值", example = "0.7")
    private Double threshold = 0.7;
    
    /**
     * 是否启用检索功能
     * 控制是否启用知识库检索功能，false时将直接使用AI模型回答
     */
    @Schema(description = "是否启用检索功能", example = "true")
    private Boolean enableRetrieval = true;
}